package com.em.sugarfight.util;

import com.em.sugarfight.entity.*;
import org.springframework.stereotype.Component;


/**
 * 坐标转换工具类 - 统一处理像素坐标和格子坐标的转换
 */
public class CoordinateConverter {

    // 地图常量
    public static final int MAP_WIDTH = 28;  // 格子宽度
    public static final int MAP_HEIGHT = 16; // 格子高度
    public static final int CELL_SIZE = 50;  // 每个格子50像素
    public static final int CELL_CENTER_OFFSET = 25; // 格子中心偏移量

    /**
     * 像素坐标转换为格子坐标
     * @param pixelPosition 像素坐标
     * @return 格子坐标
     */
    public static Position pixelToGrid(PixelPosition pixelPosition) {
        // 根据文档：格子坐标为(0,0)的格子，其中心点像素坐标为(25,25)
        // 公式：gridX = (pixelX - 25) / 50, gridY = (pixelY - 25) / 50
        int gridX = (pixelPosition.getX() - CELL_CENTER_OFFSET) / CELL_SIZE;
        int gridY = (pixelPosition.getY() - CELL_CENTER_OFFSET) / CELL_SIZE;

        // 边界检查和修正
        gridX = Math.max(0, Math.min(MAP_WIDTH - 1, gridX));
        gridY = Math.max(0, Math.min(MAP_HEIGHT - 1, gridY));

        return new Position(gridX, gridY);
    }

    /**
     * 格子坐标转换为像素坐标（中心点）
     * @param Position 格子坐标
     * @return 像素坐标
     */
    public static PixelPosition gridToPixel(Position Position) {
        // 根据文档：格子坐标为(27,15)的格子，其中心点像素坐标为(50*27+25, 50*15+25)
        int pixelX = CELL_SIZE * Position.getX() + CELL_CENTER_OFFSET;
        int pixelY = CELL_SIZE * Position.getY() + CELL_CENTER_OFFSET;

        return new PixelPosition(pixelX, pixelY);
    }

    /**
     * 检查格子坐标是否在地图范围内
     */
    public static boolean isValidPosition(Position pos) {
        return pos.getX() >= 0 && pos.getX() < MAP_WIDTH &&
                pos.getY() >= 0 && pos.getY() < MAP_HEIGHT;
    }

    /**
     * 检查格子坐标是否在地图范围内
     */
    public static boolean isValidPosition(int x, int y) {
        return x >= 0 && x < MAP_WIDTH && y >= 0 && y < MAP_HEIGHT;
    }

    /**
     * 计算两个格子坐标的曼哈顿距离
     */
    public static int manhattanDistance(Position pos1, Position pos2) {
        return Math.abs(pos1.getX() - pos2.getX()) + Math.abs(pos1.getY() - pos2.getY());
    }
}

